#include <iostream>
#include <cassert>
#include <cstring>
#include <string>
#include <cstdio>
#include <pthread.h>
#include <unistd.h>
#include "Thread.h"
using namespace std;

// string convertToId(const pthread_t& tid) {
//     char id_buffer[64];
//     snprintf(id_buffer, sizeof id_buffer, "0X%x", tid);

//     return string(id_buffer);
// }

// void* start_routine(void* args) {
//     string thread_name(static_cast<const char*>(args));

//     while (true) {
//         cout << "I am " << thread_name 
//         << " my tid is: " << convertToId(pthread_self()) 
//         << "i am working now!" << endl;

//         sleep(1);
//     }

//     return nullptr;
// }

// int main() {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, start_routine, (void*)"one new thread");
//     int ret_detach = pthread_detach(tid); // 不等待子进程，让子进程退出后的资源由OS回收
//     assert(ret_detach == 0);
//     (void)ret_detach;

//     string main_thread_id = convertToId(pthread_self());
//     cout << "main thread running now, main thread is: " << main_thread_id 
//     << " new thread is:" << convertToId(tid) << endl;

//     int ret_join = pthread_join(tid, nullptr); //因为前面已经设定了新线程不需要等待，所以这里会返回错误
//     cout << "ret_join: " << ret_join 
//     << " error message: " << strerror(ret_join) << endl;

//     sleep(5);

//     // 实验证明，主线程退出了，其余的线程也会退出
//     cout << "main thread quit!" << endl;
//     return 0;
// }

#define CIRCULE_NUM 10000
static int num = 0;

void* addUp(void*) {
    int cnt = CIRCULE_NUM;
    while (cnt--) {
        ++num;
    }

    return nullptr;
}

int main() {
    Thread thread0(addUp, nullptr, 0);
    Thread thread1(addUp, nullptr, 1);
    Thread thread2(addUp, nullptr, 2);
    Thread thread3(addUp, nullptr, 3);

    thread0.join();
    thread1.join();
    thread2.join();
    thread3.join();

    cout << "num: " << num << endl;

    return 0;
}

// #include <atomic>
// #include <thread>
// #include <vector>
// #include <iostream>
// using namespace std;

// int main() {
//     // int cnt = 0;
//     atomic<int> cnt(0);
//     vector<thread> threads(4);
//     for (auto& thread : threads) {
//         thread = std::thread([&cnt](int n) -> void {
//             while (n--) {
//                 ++cnt;
//             }
//         }, 10000000);
//     }

//     for (auto& thread : threads) {
//         thread.join();
//     }

//     cout << cnt << endl;
//     return 0;
// }